﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    /// <summary>
    /// Formulario con el dgv para consultar y modificar los usuarios
    /// </summary>
    public partial class formularioUsuarios : UserControl
    {
        /// <summary>
        /// Representa una instancia de la clase. De esta forma trabajare
        /// Siempre con el mismo formulario
        /// </summary>
        private static readonly formularioUsuarios instancia = new formularioUsuarios();
        /// <summary>
        /// Una lista de objetos
        /// </summary>
        private ArrayList lista;

        /// <summary>
        /// Obtiene la instancia del formulario.De esta forma trabajare
        /// siempre con el mismo formulario
        /// </summary>
        public static formularioUsuarios Instancia
        {
            get { return instancia; }
        }

        /// <summary>
        /// Muestra un formulario en el panel pOpcionesUsuario
        /// </summary>
        /// <param name="o"></param>
        public void MuestraForm(UserControl o)
        {
            pOpcionesUsuario.Controls.Clear();
            pOpcionesUsuario.Controls.Add(o);
            o.Dock = DockStyle.Fill;
        }

        /// <summary>
        /// Constructor por defecto de la clase
        /// </summary>
        public formularioUsuarios()
        {
            InitializeComponent();
            MuestraForm(formularioUsuarioEditar.Instancia);
        }

        /// <summary>
        /// Evento que se ejecuta al cargarse el formulario y que siempre
        /// rellenara el dgvusurios.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void formularioUsuarios_Load(object sender, EventArgs e)
        {
                RellenaDGV();
        }

        /// <summary>
        /// Función que permite rellenar el dgv con todos los usuarios que
        /// hay en la BD
        /// </summary>
        public void RellenaDGV()
        {
            lista = CADUsuario.Instancia.obtenerUsuarios();
            dgvUsuarios.Rows.Clear();

            //Aqui direccion de las imagenes.
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\usuarios\";


            int numfilas = 0;
            int i = 0;
            foreach (ENUsuario us in lista)
            {
                if (i == 0 && us != null)
                {
                    MuestraForm(formularioUsuarioEditar.Instancia);

                    //Completar la información del formulario
                    formularioUsuarioEditar.Instancia.cargarDatosUsuario(us.NombreUsuario, us.PassUsuario, us.EmailUsuario,
                        us.FechaRegUsuario, us.CXBaseUsuario, us.CYBaseUsuario, us.CXCuadranteUsuario, us.CYCuadranteUsuario,
                        us.IDUsuario);
                }
                i++;
                dgvUsuarios.Rows.Add(1);
                try
                {
                    dgvUsuarios.Rows[numfilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + us.NombreUsuario + ".png");
                }
                catch (Exception)
                {
                    dgvUsuarios.Rows[numfilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                }
                dgvUsuarios.Rows[numfilas].Cells[1].Value = us.NombreUsuario.ToString();
                dgvUsuarios.Rows[numfilas].Cells[2].Value = us.IDUsuario.ToString(); ;//Esta columna esta oculta pues
                //solo la quiero para cuando tenga que recuperar un usuario a partir de un dgv
                numfilas++;
            }
        }

        /// <summary>
        /// Función que permite rellenar el dgvusuarios con una lista de usuarios
        /// que se le pasa como parámetro.
        /// </summary>
        /// <param name="lista"> Lista de objetos ENUsuario con los usuarios</param>
        public void RellenaDGVConBusqueda(ArrayList lista)
        {
            //Limpiamos el dgv
            dgvUsuarios.Rows.Clear();

            //Compruebo si la lista esta vacia. Si lo esta muestro un message box en el que dice que ningun usuario coincide con el criterio busqueda.
            if (lista == null)
            {
                MessageBox.Show("No se ha encontrado ningun usuario que coincida con los criterios de busqueda", "Resultado de la busqueda",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Se han encontrado "+ lista.Count.ToString() +" usuarios que coinciden con los criterios de busqueda" , "Resultado de la busqueda",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Aqui direccion de las imagenes.
                string mdf = Application.ExecutablePath;
                mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

                string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
                mdf2 += @"\clonegame\imagenes\usuarios\";


                int numfilas = 0;
                int i = 0;
                foreach (ENUsuario us in lista)
                {
                    if (i == 0 && us != null)
                    {

                        //Borrar Información Previa Paginas
                        formularioUsuarioEditar.Instancia.BorrarPaginaEdificios();
                        formularioUsuarioEditar.Instancia.BorrarPaginaCliente();
                        //Completar la información del formulario

                        formularioUsuarioEditar.Instancia.cargarDatosUsuario(us.NombreUsuario, us.PassUsuario, us.EmailUsuario,
                                us.FechaRegUsuario, us.CXBaseUsuario, us.CYBaseUsuario, us.CXCuadranteUsuario, us.CYCuadranteUsuario,
                                us.IDUsuario);

                    }
                    i++;
                    dgvUsuarios.Rows.Add(1);
                    try
                    {
                        dgvUsuarios.Rows[numfilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + us.NombreUsuario + ".png");
                    }
                    catch (Exception)
                    {
                        dgvUsuarios.Rows[numfilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                    }
                    dgvUsuarios.Rows[numfilas].Cells[1].Value = us.NombreUsuario.ToString();
                    dgvUsuarios.Rows[numfilas].Cells[2].Value = us.IDUsuario.ToString(); ;//Esta columna esta oculta pues
                    //solo la quiero para cuando tenga que recuperar un usuario a partir de un dgv
                    numfilas++;
                }
            }
        }

        /// <summary>
        /// Inicia el proceso de inserción de un nuevo usuario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btAnadir_Click(object sender, EventArgs e)
        {
            formularioUsuarioEditar.Instancia.NuevoUsuario();
        }

        /// <summary>
        /// Carga los datos del usuario en el Formulario de edición busqueda cuando se hace
        /// click sobre una fila del dgvusuarios
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvUsuarios_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                //Obtenemos la información del usuario.
                int unaID = Convert.ToInt32(dgvUsuarios.Rows[e.RowIndex].Cells[2].Value);

                ENUsuario us1 = CADUsuario.Instancia.ObtenerUnUsuario(unaID);

                //Comprobamos si el usuario existe
                if (us1 != null)
                {
                    //Pasar al estado de edicion.
                    //Voy a crear una funcion que represente los estados editar y busqueda que se corresponden con los botones.


                    //Cargar formulario de edición.¿Es necesario? Se supone que llegados a este punto ya esta cargado.

                    //Borrar información del formulario
                    formularioUsuarioEditar.Instancia.BorrarPaginaCliente();
                    formularioUsuarioEditar.Instancia.BorrarPaginaEdificios();
                    //Completar la información del formulario.
                    formularioUsuarioEditar.Instancia.cargarDatosUsuario(us1.NombreUsuario, us1.PassUsuario, us1.EmailUsuario,
                            us1.FechaRegUsuario, us1.CXBaseUsuario, us1.CYBaseUsuario, us1.CXCuadranteUsuario, us1.CYCuadranteUsuario,
                            us1.IDUsuario);
                    //No es necesario lo siguiente
                    //formularioUsuarioEditar.Instancia.DesactivarTBNick();

                }
                else
                {
                    //Mostrar un error por ejemplo en un MessageBox
                }
            }
        }

        /// <summary>
        /// Elimina el usuario cargado actualmente en el Formulario UsuariosEditar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btEliminar_Click(object sender, EventArgs e)
        {
            formularioUsuarioEditar.Instancia.EliminarUsuarioActual();
        }

        /// <summary>
        /// Función que me permite actualizar la imagen de un determinado usuario en el DGV, para que
        /// no haya problemas en su eliminación y cambio por otra.
        /// </summary>
        /// <param name="iduser">Entero con la id del usuario</param>
        public void LiberarImagenDeUsuario(int iduser)
        {
            for (int i = 0; i < dgvUsuarios.Rows.Count; i++)
            {
                if (iduser == Convert.ToInt32(dgvUsuarios.Rows[i].Cells[2].Value))
                {
                    ((Image)dgvUsuarios.Rows[i].Cells[0].Value).Dispose();//Liberamos la imagen.
                }
            }
        }

        /// <summary>
        /// Me permite actualizar la imagen de un usuario concreto
        /// en el dgvusuarios
        /// </summary>
        /// <param name="iduser"></param>
        public void ActualizarImagenUsuario(int iduser)
        {
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\usuarios\";
            for (int i = 0; i < dgvUsuarios.Rows.Count; i++)
            {
                if (iduser == Convert.ToInt32(dgvUsuarios.Rows[i].Cells[2].Value))
                {
                    string nomusuario = dgvUsuarios.Rows[i].Cells[1].Value.ToString();
                    dgvUsuarios.Rows[i].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + nomusuario + ".png");
                }
            }
        }

        private void dgvUsuarios_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

        private void formularioUsuarios_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

    }
}
